package top.hzy520.personalblog.service;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import top.hzy520.personalblog.dao.CommentRepository;
import top.hzy520.personalblog.po.Comment;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class CommentServiceImpl implements  CommentService {

    @Autowired
    private CommentRepository commentRepository;

    @Override
    public List<Comment> listCommentByBlogId(Long blogId) {
        Sort sort=new Sort(Sort.Direction.ASC,"createTime");
      List<Comment> comments=commentRepository.findByBlogIdAndParentCommentNull(blogId,sort);
        return eachComment(comments);
    }

    @Transactional
    @Override
    public Comment saveComment(Comment comment) {
        Long parentCommentId=comment.getParentComment().getId();
        if (parentCommentId!=-1){
            comment.setParentComment(commentRepository.findOne(parentCommentId));
        } else {
            comment.setParentComment(null);
        }
        comment.setCreateTime(new Date());
        return commentRepository.save(comment);
    }

    @Override
    public Page<Comment> listComment(Pageable pageable) {
        return commentRepository.findAll(pageable);
    }

    @Override
    public void deleteComment(Long id) {
        commentRepository.delete(id);
    }

    @Override
    public Comment getComment(Long id) {
        return commentRepository.findOne(id);
    }

    /****
     * 循环每个顶级的评论节点
     * @param comments
     * @return
     */
    private List<Comment> eachComment(List<Comment> comments){
        List<Comment> commentsView=new ArrayList<>();
        for (Comment comment: comments){
            Comment c=new Comment();
            BeanUtils.copyProperties(comment,c);
            commentsView.add(c);
        }
        //合并评论的各层子代到第一级子代集合中
        combineChild(commentsView);
        return commentsView;
    }

    /****
     *
     * @param comments root根节点,blog不能为空的对象集合
     */
    private  void combineChild(List<Comment> comments){
        for (Comment comment:comments){
            List<Comment> replys1=comment.getReplatComments();
            for (Comment reply1 : replys1){
                //循环迭代,找出子代存放在temReplys中
                recursively(reply1);
            }
            //修改顶级节点的reply集合为迭代处理后的集合
            comment.setReplatComments(tempReplys);
            //清除临时存放区
            tempReplys =new ArrayList<>();
        }
    }
    //存放迭代找出的所有子代集合
    private  List<Comment> tempReplys=new ArrayList<>();

    /****
     * 递归迭代
     * @param comment 被迭代对象
     */
    private void recursively(Comment comment){
        tempReplys.add(comment);//顶节点添加到临时存放集合
        if (comment.getReplatComments().size()>0){
            List<Comment> replys=comment.getReplatComments();
            for (Comment reply: replys){
                tempReplys.add(reply);
                if (reply.getReplatComments().size()>0){
                    recursively(reply);
                }
            }
        }
    }

}
